//package cn.iocoder.yudao.module.locale.interceptor;
//
//import cn.hutool.core.collection.CollUtil;
//import cn.hutool.core.collection.CollectionUtil;
//import cn.hutool.core.lang.Filter;
//import cn.hutool.core.util.ReflectUtil;
//import cn.hutool.core.util.StrUtil;
//import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
//import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
//import cn.iocoder.yudao.module.locale.framework.config.LocaleTableMetadataConfig;
//import cn.iocoder.yudao.module.locale.controller.admin.tabledata.vo.TableDataSaveReqVO;
//import cn.iocoder.yudao.module.locale.controller.app.tabledata.vo.TableDataConditionReqVO;
//import cn.iocoder.yudao.module.locale.dal.dataobject.tabledata.TableDataDO;
//import cn.iocoder.yudao.module.locale.model.LocaleTableMetadata;
//import cn.iocoder.yudao.module.locale.service.tabledata.TableDataService;
//import cn.iocoder.yudao.module.system.api.translate.ITranslateApi;
//import com.baomidou.mybatisplus.annotation.TableId;
//import com.baomidou.mybatisplus.annotation.TableName;
//import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.ibatis.executor.Executor;
//import org.apache.ibatis.mapping.MappedStatement;
//import org.apache.ibatis.mapping.SqlCommandType;
//
//import javax.annotation.Resource;
//import java.lang.reflect.Field;
//import java.util.Arrays;
//import java.util.Collection;
//import java.util.List;
//import java.util.Map;
//
//@Slf4j
//public class TranslateInterceptor_bak implements InnerInterceptor {
//    private LocaleTableMetadataConfig localeConfig;
//    private TableDataService tableDataService;
//    @Resource
//    private ITranslateApi translateApi;
//
//    public TranslateInterceptor_bak(LocaleTableMetadataConfig localeConfig, TableDataService tableDataService) {
//        this.localeConfig = localeConfig;
//        this.tableDataService = tableDataService;
//    }
//
//    @Override
//    public boolean willDoUpdate(Executor executor, MappedStatement ms, Object parameter) {
//        final SqlCommandType sqlCommandType = ms.getSqlCommandType();
//        if (sqlCommandType == SqlCommandType.INSERT || sqlCommandType == SqlCommandType.UPDATE) {
//            // 获取DO实体类
//            final Object objectDO = getObjectDO(parameter);
//            if (objectDO == null || localeConfig.getMetadata() == null) {
//                return true;
//            }
//
//            final boolean enable = localeConfig.getMetadata().isEnable();
//            if (!enable) {
//                return true;
//            }
//
//            // 获取表名
//            final String tableName = extractTableName(objectDO);
//
//            // 获取配置
//            final LocaleTableMetadata.TableInfo tableInfo = getTableInfo(tableName);
//
//            if (tableInfo != null) {
//                // 获取需要翻译的列名
//                final Collection<String> columnsToTranslate = tableInfo.getColumnList();
//
//                if (CollectionUtil.isNotEmpty(columnsToTranslate)) {
//                    // 获取id字段
//                    final Field tableIdField = getTableIdField(objectDO);
//
//                    // 获取id字段值
//                    final Object tableIdValue = ReflectUtil.getFieldValue(objectDO, tableIdField.getName());
//                    if (tableIdValue == null) {
//                        return true;
//                    }
//                    final String rowId = tableIdValue.toString();
//
//                    final List<String> supportedLanguages = localeConfig.getMetadata().getSupportedLanguageList();
//                    for (String languageCode : supportedLanguages) {
//                        // 查询多语言国际化数据
//                        final List<TableDataDO> tableDataDOList = queryLanguageTableData(languageCode, tableName, rowId);
//
//                        // 遍历需要翻译的列
//                        for (String columnName : columnsToTranslate) {
//                            // 将列名转换为DO实体类的字段名
//                            final String fieldName = camelCaseToUnderscore(columnName);
//
//                            // 获取字段值
//                            final Object columnValue = ReflectUtil.getFieldValue(objectDO, fieldName);
//
//                            // 判断字段值是否变更
//                            final boolean columnValueChanged = isColumnValueChanged(tableDataDOList, columnName, columnValue);
//                            if (!columnValueChanged) {
//                                log.info("翻译字段-字段值未变更, tableName = {}, columnName = {}, languageCode = {}, columnValue = {}",
//                                        tableName, columnName, languageCode, columnValue);
//                                continue;
//                            }
//
//                            if (columnValue instanceof String && StrUtil.isNotEmpty((CharSequence) columnValue)) {
//                                // 调用Google翻译API进行翻译
//                                String translatedValue = translate((String) columnValue, languageCode);
//                                log.info("翻译字段, tableName = {}, columnName = {}, languageCode = {}, columnValue = {}, translatedValue = {}",
//                                        tableName, columnName, languageCode, columnValue, translatedValue);
//
//                                // 存储多语言国际化数据
//                                createLanguageTableData(columnName, languageCode, tableName, tableIdValue, (String) columnValue, translatedValue, tableDataDOList);
//                            }
//                        }
//                    }
//                }
//            }
//        }
//        return true;
//    }
//
//    // 判断字段值是否变更
//    private boolean isColumnValueChanged(List<TableDataDO> tableDataDOList, String columnName, Object columnValue) {
//        if (CollUtil.isEmpty(tableDataDOList)) {
//            return true;
//        }
//
//        for (TableDataDO tableDataDO : tableDataDOList) {
//            if (tableDataDO.getColumnName().equals(columnName)) {
//                final String columnRawValue = tableDataDO.getColumnRawValue();
//                if (columnRawValue.equals(columnValue)) {
//                    return false;
//                }
//            }
//        }
//
//        return true;
//    }
//
//    // 查询多语言国际化数据
//    private List<TableDataDO> queryLanguageTableData(String languageCode, String tableName, String rowId) {
//        // 查询是否已存在
//        final TableDataConditionReqVO conditionVO = new TableDataConditionReqVO();
//        conditionVO.setLanguage(languageCode);
//        final TableDataConditionReqVO.TableCondition tableCondition = new TableDataConditionReqVO.TableCondition(tableName, Arrays.asList(rowId));
//        conditionVO.setTableConditionList(Arrays.asList(tableCondition));
//        final List<TableDataDO> tableDataDOList = tableDataService.selectList(conditionVO);
//        return tableDataDOList;
//    }
//
//    // 存储多语言国际化数据
//    private void createLanguageTableData(String columnName, String languageCode,
//                                         String tableName, Object tableIdValue,
//                                         String columnValue, String translatedValue,
//                                         List<TableDataDO> tableDataDOList) {
//
//        final String rowId = tableIdValue.toString();
//
//        final TableDataSaveReqVO vo = new TableDataSaveReqVO();
//        vo.setLanguageCode(languageCode);
//        vo.setTableName(tableName);
//        vo.setRowId(rowId);
//        vo.setColumnName(columnName);
//        vo.setColumnRawValue(columnValue);
//        vo.setColumnTranslatedValue(translatedValue);
//        vo.setStatus(CommonStatusEnum.ENABLE.getStatus());
//
//        if (CollUtil.isEmpty(tableDataDOList)) {
//            tableDataService.createTableData(vo);
//        } else {
//            final TableDataDO oldRow = tableDataDOList.get(0);
//            vo.setId(oldRow.getId());
//            tableDataService.updateTableData(vo);
//        }
//    }
//
//    private static Field getTableIdField(Object objectDO) {
//        final Field[] fields = ReflectUtil.getFields(objectDO.getClass(), new Filter<Field>() {
//            @Override
//            public boolean accept(Field field) {
//                final TableId annotation = field.getAnnotation(TableId.class);
//                return annotation != null;
//            }
//        });
//
//        if (fields != null && fields.length > 0) {
//            return fields[0];
//        }
//
//        return null;
//    }
//
//    // 将驼峰结构的字段名转换为下划线结构的mysql列名
//    public static String camelCaseToUnderscore(String camelCase) {
//        // 使用正则表达式将驼峰命名转换为下划线命名
//        String regex = "([a-z])([A-Z]+)";
//        String replacement = "$1_$2";
//        String underscore = camelCase.replaceAll(regex, replacement).toLowerCase();
//        return underscore;
//    }
//
//    private LocaleTableMetadata.TableInfo getTableInfo(String tableName) {
//        if (StrUtil.isEmpty(tableName)) {
//            return null;
//        }
//
//        if (localeConfig.getMetadata() == null) {
//            return null;
//        }
//
//        for (LocaleTableMetadata.TableInfo info : localeConfig.getMetadata().getTableList()) {
//            if (tableName.equals(info.getTableName())) {
//                return info;
//            }
//        }
//        return null;
//    }
//
//    private Object getObjectDO(Object parameter) {
//        if (parameter != null) {
//            if (parameter instanceof Map) {
//                final Object objectDO = ((Map<?, ?>) parameter).get("param1");
//                return objectDO;
//            } else if (parameter instanceof BaseDO) {
//                return parameter;
//            }
//        }
//        return null;
//    }
//
//    private String extractTableName(Object objectDO) {
//        final TableName tableNameAnno = objectDO.getClass().getAnnotation(TableName.class);
//        if (tableNameAnno != null) {
//            final String tableName = tableNameAnno.value();
//            return tableName;
//        }
//        return null;
//    }
//
//    private String translate(String text, String targetLanguage) {
//        final String translatedText = translateApi.translate(text, targetLanguage);
//        return translatedText;
//    }
//
//}
